// ============================== 导入依赖 ============================== //

import CORE from '@/CORE'

// ============================== 导出混合 ============================== //

export default {
  /**
   * 混入列表 (配置选项合并)
   */
  mixins: [CORE.mixWeb(), CORE.mixInfo()],

  /**
   * 状态数据 (函数返回对象)
   */
  data() {
    return {
      filter: '', // 筛选值
      model: [], // 双向绑定列表
    }
  },

  /**
   * 计算属性 (慎用箭头函数)
   */
  computed: {
    /**
     * 表格属性
     */
    tableProps() {
      const { info: { obj, bind, right, idKey, nameKey, height }, model, filter } = this
      return {
        key: JSON.stringify(obj[bind]),
        list: model.filter((item) => !filter || item[nameKey].includes(filter)),
        param: right,
        idKey,
        height,
        auto: false,
        noPage: true,
        isLongList: false,
      }
    },
  },

  /**
   * 监听属性 (深度 deep 首次 immediate)
   */
  watch: {
    /**
     * 监听所属对象
     */
    'info.obj': {
      deep: true,
      immediate: true,
      handler() {
        const { isDiff, setModel } = this
        if (isDiff()) setModel()
      },
    },
  },

  /**
   * 本地方法 (轻量重要在前)
   */
  methods: {
    /**
     * 是否不等 (可覆盖)
     */
    isDiff() {
      const { info: { obj, bind, idKey }, model } = this
      const value = obj[bind]
      if (!CORE.isArray(value)) return model.length

      const valueIds = value.map((item) => item[idKey])
      const modelIds = model.map((item) => item[idKey])

      return valueIds !== modelIds
    },

    /**
     * 设置内部绑定值 (可覆盖)
     */
    setModel() {
      const { info: { obj, bind, idKey } } = this
      const value = obj[bind]
      this.model = CORE.isArray(value) ? value : []
      this.info.right.idList = this.model.map((item) => item[idKey])
    },
  },
}
